/*
 * Funcionario.java
 *
 * Created on October 7, 2007, 10:50 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package petstore.model;

import petstore.model.enumeration.Sexo;
import java.util.Collection;
import java.util.Date;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * Entity class Funcionario
 * 
 * @author Tom Hayden
 */
@Entity
@Table(name = "funcionario")
@AttributeOverrides( {
    @AttributeOverride(name="id", column=@Column(name="cdfuncionario")),
    @AttributeOverride(name="description", column=@Column(name="nmfuncionario")),
    @AttributeOverride(name="active", column=@Column(name="ativo"))
})
@NamedQueries( {
    @NamedQuery(name="Funcionario.findByPerfilAtendimento", 
                query="SELECT f " +
                      "FROM Funcionario f " +
                      "JOIN f.usuario u " +
                      "JOIN u.perfil p " +
                      "WHERE p.id = :idPerfil " +
                      "AND f.agenda IS NOT NULL " +
                      "AND f.active = true " +
                      "ORDER BY f.description"),
    @NamedQuery(name="Funcionario.findByUsuario", 
                query="SELECT f " +
                      "FROM Funcionario f " +
                      "JOIN f.usuario u " +
                      "WHERE u.id = :idUsuario " +
                      "AND f.active = true " +
                      "AND u.active = true " +
                      "ORDER BY f.description")
})
public class Funcionario extends CodeData {

    @Column(name = "apelido")
    private String apelido;

    @Column(name = "rg")
    private String RG;

    @Column(name = "orgaoexpedidor")
    private String orgaoExpedido;

    @Column(name = "cpf")
    private String CPF;

    @Column(name = "cp")
    private String CP;

    @Column(name = "seriecp")
    private String serieCp;

    @Column(name = "dtnascimento")
    @Temporal(TemporalType.DATE)
    private Date dataNascimento;

    @Column(name = "dtadmissao")
    @Temporal(TemporalType.DATE)
    private Date dataAdmissao;

    @Column(name = "dtdemissao")
    @Temporal(TemporalType.DATE)
    private Date dataDemissao;

    @Column(name = "email")
    private String email;

    @Column(name = "prccomissao")
    private Double percentualComissao;

    @Column(name = "prcdesconto")
    private Double percentualDesconto;

    @Column(name = "sexo")
    @Enumerated(EnumType.ORDINAL)
    private Sexo sexo;

    @Column(name = "dtpagamento")
    @Temporal(TemporalType.DATE)
    private Date dataPagamento;

    @Column(name = "vlrsalario")
    private Double valorSalario;

    @Column(name = "cargahoraria")
    private Short cargaHoraria;

    @Column(name = "custohora")
    private Double custoHora;

    @Column(name = "custohoraextra")
    private Double custoHoraExtra;

    @ManyToOne
    @JoinColumn(name="cdagenda")
    private Agenda agenda;
    
    @ManyToOne
    @JoinColumn(name="cdusuario")
    private Usuario usuario;
    
    @ManyToOne
    @JoinColumn(name="cdcargo")
    private Cargo cargo;

    @ManyToOne
    @JoinColumn(name = "cduf")
    private UF ufNaturalidade;

    @ManyToOne
    @JoinColumn(name="cdativprofissional")
    private AtividadeProfissional atividadeProfissional;

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name="funcionario_telefone",
               joinColumns={@JoinColumn(name="cdfuncionario", referencedColumnName="cdfuncionario")},
               inverseJoinColumns={@JoinColumn(name="cdtelefone", referencedColumnName="cdtelefone")})
    private Collection<Telefone> telefones;
    
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name="funcionario_endereco",
               joinColumns={@JoinColumn(name="cdfuncionario", referencedColumnName="cdfuncionario")},
               inverseJoinColumns={@JoinColumn(name="cdendereco", referencedColumnName="cdendereco")})
    private Collection<Endereco> enderecos;

    /** Creates a new instance of Funcionario */
    public Funcionario() {
    }

    public Funcionario(Integer id) {
        super(id);
    }

    public String getApelido() {
        return apelido;
    }

    public void setApelido(String apelido) {
        this.apelido = apelido;
    }

    public String getRG() {
        return RG;
    }

    public void setRG(String RG) {
        this.RG = RG;
    }

    public String getOrgaoExpedido() {
        return orgaoExpedido;
    }

    public void setOrgaoExpedido(String orgaoExpedido) {
        this.orgaoExpedido = orgaoExpedido;
    }

    public String getCPF() {
        return CPF;
    }

    public void setCPF(String CPF) {
        this.CPF = CPF;
    }

    public String getCP() {
        return CP;
    }

    public void setCP(String CP) {
        this.CP = CP;
    }

    public String getSerieCp() {
        return serieCp;
    }

    public void setSerieCp(String serieCp) {
        this.serieCp = serieCp;
    }

    public Date getDataNascimento() {
        return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento) {
        this.dataNascimento = dataNascimento;
    }

    public Date getDataAdmissao() {
        return dataAdmissao;
    }

    public void setDataAdmissao(Date dataAdmissao) {
        this.dataAdmissao = dataAdmissao;
    }

    public Date getDataDemissao() {
        return dataDemissao;
    }

    public void setDataDemissao(Date dataDemissao) {
        this.dataDemissao = dataDemissao;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Double getPercentualComissao() {
        return percentualComissao;
    }

    public void setPercentualComissao(Double percentualComissao) {
        this.percentualComissao = percentualComissao;
    }

    public Double getPercentualDesconto() {
        return percentualDesconto;
    }

    public void setPercentualDesconto(Double percentualDesconto) {
        this.percentualDesconto = percentualDesconto;
    }

    public Sexo getSexo() {
        return sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    public Date getDataPagamento() {
        return dataPagamento;
    }

    public void setDataPagamento(Date dataPagamento) {
        this.dataPagamento = dataPagamento;
    }

    public Double getValorSalario() {
        return valorSalario;
    }

    public void setValorSalario(Double valorSalario) {
        this.valorSalario = valorSalario;
    }

    public Short getCargaHoraria() {
        return cargaHoraria;
    }

    public void setCargaHoraria(Short cargaHoraria) {
        this.cargaHoraria = cargaHoraria;
    }

    public Double getCustoHora() {
        return custoHora;
    }

    public void setCustoHora(Double custoHora) {
        this.custoHora = custoHora;
    }

    public Double getCustoHoraExtra() {
        return custoHoraExtra;
    }

    public void setCustoHoraExtra(Double custoHoraExtra) {
        this.custoHoraExtra = custoHoraExtra;
    }

    public Agenda getAgenda() {
        return agenda;
    }

    public void setAgenda(Agenda agenda) {
        this.agenda = agenda;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Cargo getCargo() {
        return cargo;
    }

    public void setCargo(Cargo cargo) {
        this.cargo = cargo;
    }

    public UF getUfNaturalidade() {
        return ufNaturalidade;
    }

    public void setUfNaturalidade(UF ufNaturalidade) {
        this.ufNaturalidade = ufNaturalidade;
    }

    public AtividadeProfissional getAtividadeProfissional() {
        return atividadeProfissional;
    }

    public void setAtividadeProfissional(AtividadeProfissional atividadeProfissional) {
        this.atividadeProfissional = atividadeProfissional;
    }

    public Collection<Telefone> getTelefones() {
        return telefones;
    }

    public void setTelefones(Collection<Telefone> telefones) {
        this.telefones = telefones;
    }

    public Collection<Endereco> getEnderecos() {
        return enderecos;
    }

    public void setEnderecos(Collection<Endereco> enderecos) {
        this.enderecos = enderecos;
    }

}
